﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using Sispe.Entities;
using Sispe.BussinesLogic;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.IO;
using System.Security.Cryptography;
using System.Text;


namespace Sispe.Mvc4.Controllers
{
    public class TrabajadorController : Controller
    {
        #region Dependencias

        [Dependency]
        public ITrabajadorBL _trabajadorBL { get; set; }

        [Dependency]
        public IEstadoCivilBL estCivilBL { get; set; }

        [Dependency]
        public ISexoBL sexoBL { get; set; }

        [Dependency]
        public ILineaTelefonicaBL linTelfBL { get; set; }

        [Dependency]
        public ISocioBL socioBL { get; set; }

        [Dependency]
        public IRegimenPensionarioBL regPensionarioBL { get; set; }

        [Dependency]
        public IBancoBL bancoBL { get; set; }

        [Dependency]
        public IUbicacionTrabajadorBL ubicTrabBL { get; set; }

        [Dependency]
        public IUbigeoBL ubigeoBL { get; set; }

        [Dependency]
        public IRuralBL ruralBL { get; set; }

        [Dependency]
        public IPersonaBL personaBL { get; set; }

        [Dependency]
        public IReferenciaBL referenciaBL { get; set; }

        [Dependency]
        public IEspecialidadTrabajadorBL esptrabBL { get; set; }

        [Dependency]
        public IEstudioBL estudioBL { get; set; }

        [Dependency]
        public ITrabajadorEspecialidadBL trabEspecialidadBL { get; set; }

        [Dependency]
        public ITrabajadorPadreBL trabPadreBL { get; set; }

        [Dependency]
        public ITelefonoBL telefonoBL { get; set; }

        [Dependency]
        public IFotocheckBL fotocheckBL { get; set; }

        [Dependency]
        public IFotoBL fotoBL { get; set; }

        #endregion


        public ActionResult Index()
        {
            var trabajadores = _trabajadorBL.GetAllFromTrabajador();
            return View(trabajadores);
        }


        public ActionResult Create()
        {
            var sexo = sexoBL.GetAllFromSexo();
            ViewData["IdSexo"] = new SelectList(sexo, "IdSexo", "Descripcion");

            var estadoCivil = estCivilBL.GetAllFromEstadoCivil();
            ViewData["IdEstadoCivil"] = new SelectList(estadoCivil, "IdEstadoCivil", "Descripcion");

            var socio = socioBL.GetAllFromSocio();
            ViewData["IdSocio"] = new SelectList(socio, "IdSocio", "RazonSocial");

            var regimenPensionario = regPensionarioBL.GetAllFromRegimenPensionario();
            ViewData["IdRegimenPensionario"] = new SelectList(regimenPensionario, "IdRegimenPensionario", "Descripcion");

            var banco = bancoBL.GetAllFromBanco();
            ViewData["IdBanco"] = new SelectList(banco, "IdBanco", "Descripcion");

            var ubicTrb = ubicTrabBL.GetAllFromUbicacionTrabajador();
            ViewData["IdUbicacionTrabajador"] = new SelectList(ubicTrb, "IdUbicacionTrabajador", "Descripcion");

            var ubigeo = ubigeoBL.GetAllFromUbigeos();
            ViewData["IdUbigeo"] = new SelectList(ubigeo, "IdUbigeo", "UbigeoCompleto");

            var rural = ruralBL.GetAllFromRural();
            ViewData["IdRural"] = new SelectList(rural, "IdRural", "CentroPoblado");

            var estudios = estudioBL.GetAllFromEstudios();
            ViewData["IdEstudios"] = new SelectList(estudios, "IdEstudios", "EstudiosCompletos");

            return View();
        }

        [HttpPost]
        public ActionResult Create(FormCollection colection, PERSONA _persona, HttpPostedFileBase image, HttpPostedFileBase pdf)
        {

            
            var newPersona = new PERSONA();
            var _trabajador = new TRABAJADOR();
            var _expediente = new EXPEDIENTE();

            newPersona.TRABAJADOR = _trabajador;
            newPersona.TRABAJADOR.EXPEDIENTE = _expediente;


            var _fotoTrabajador = new FOTO();
            newPersona.TRABAJADOR.FOTOes = _fotoTrabajador;

            if (image == null)
            {
                _fotoTrabajador.Imagen = null;
                _fotoTrabajador.IdTrabajador = newPersona.IdPersona;
                _fotoTrabajador.Hash = null;
            }

            if (image != null)
            {
                var ImageMimeType = image.ContentType;
                int length = image.ContentLength;
                byte[] buffer = new byte[length];
                image.InputStream.Read(buffer, 0, length);


                StringBuilder sb = new StringBuilder();
                /*Obtener el md5*/
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                byte[] hash = md5.ComputeHash(buffer);
                foreach (var b in hash)
                {
                    sb.Append(b.ToString("x2").ToUpper());
                }

                _fotoTrabajador.Imagen = buffer;
                _fotoTrabajador.IdTrabajador = newPersona.IdPersona;
                _fotoTrabajador.Hash = sb.ToString();
            }


            var _cirriculum = new CURRICULO();
            newPersona.TRABAJADOR.CURRICULO = _cirriculum;

            if (pdf == null)
            {
                _cirriculum.Imagen = null;
                _cirriculum.IdTrabajador = newPersona.IdPersona;
                _cirriculum.Hash = null;
            }

            if (pdf != null)
            {
                var ImageMimeTypePDF = pdf.ContentType;
                int lengthPDF = pdf.ContentLength;
                byte[] bufferPDF = new byte[lengthPDF];
                pdf.InputStream.Read(bufferPDF, 0, lengthPDF);

                StringBuilder sbPDF = new StringBuilder();
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                byte[] hash = md5.ComputeHash(bufferPDF);
                foreach (var b in hash)
                {
                    sbPDF.Append(b.ToString("x2").ToUpper());
                }

                
                _cirriculum.Imagen = bufferPDF;
                _cirriculum.IdTrabajador = newPersona.IdPersona;
                _cirriculum.Hash = sbPDF.ToString();
            }

            try
            {
                var fecha = colection["FechaNacimiento"].ToString();

                var fechaNacimientoDateTimePicker =
                Convert.ToDateTime(fecha.Substring(3, 2) + "-" + fecha.Substring(0, 2) + "-" + fecha.Substring(6, 4));

                var edad = Math.Floor((System.DateTime.Now - fechaNacimientoDateTimePicker.Date).TotalDays / 365);

                newPersona.FechaNacimiento = fechaNacimientoDateTimePicker;
                newPersona.TRABAJADOR.Edad = edad.ToString();
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                msg = "Ingrese una fecha de Nacimiento Válida";

                TempData["AlertMessage"] = msg;

                return RedirectToAction("Create");
            }


            try
            {

                newPersona.Dni = colection["Dni"].ToString();
                newPersona.ApePaterno = colection["ApePaterno"].ToString();
                newPersona.ApeMaterno = colection["ApeMaterno"].ToString();
                newPersona.Nombres = colection["Nombres"].ToString();
                newPersona.IdSexo = Int32.Parse(colection["IdSexo"].ToString());
                newPersona.IdEstadoCivil = Int32.Parse(colection["IdEstadoCivil"].ToString());
                newPersona.Direccion = colection["Direccion"].ToString();
                newPersona.Email = colection["Email"].ToString();

                newPersona.TRABAJADOR.Hijos = Int32.Parse(colection["TRABAJADOR.Hijos"].ToString());
                newPersona.TRABAJADOR.AutogeneradoEsSalud = colection["TRABAJADOR.AutogeneradoEsSalud"].ToString();

                newPersona.TRABAJADOR.CondicionDomicilio = "DOMICILIADO";


                newPersona.TRABAJADOR.GrupoSanguineo = colection["TRABAJADOR.GrupoSanguineo"].ToString();
                newPersona.TRABAJADOR.IdBanco = Int32.Parse(colection["IdBanco"].ToString());
                newPersona.TRABAJADOR.IdEstudios = Int32.Parse(colection["IdEstudios"].ToString());
                
                //newPersona.TRABAJADOR.IdReferencia = Int32.Parse(colection["IdReferencia"].ToString());
                newPersona.TRABAJADOR.IdReferencia = 1000;

                newPersona.TRABAJADOR.IdRegimenPensionario = Int32.Parse(colection["IdRegimenPensionario"].ToString());
                newPersona.TRABAJADOR.IdRural = Int32.Parse(colection["IdRural"].ToString());
                newPersona.TRABAJADOR.IdSocio = Int32.Parse(colection["IdSocio"].ToString());
                newPersona.TRABAJADOR.IdUbicacionTrabajador = Int32.Parse(colection["IdUbicacionTrabajador"].ToString());
                newPersona.TRABAJADOR.IdUbigeo = Int32.Parse(colection["IdUbigeo"].ToString());
                newPersona.TRABAJADOR.Nacionalidad = "PERUANA";
                newPersona.TRABAJADOR.NroConstanciaEstudios = colection["TRABAJADOR.NroConstanciaEstudios"].ToString();
                newPersona.TRABAJADOR.NroCuenta = colection["TRABAJADOR.NroCuenta"].ToString();
                newPersona.TRABAJADOR.NroCusp = colection["TRABAJADOR.NroCusp"].ToString();
                newPersona.TRABAJADOR.Observacion = colection["TRABAJADOR.Observacion"].ToString();
                newPersona.TRABAJADOR.Talla = colection["TRABAJADOR.Talla"].ToString();
                newPersona.TRABAJADOR.Zapato = colection["TRABAJADOR.Zapato"].ToString();
                newPersona.TRABAJADOR.PaisEmisor = "PERÚ";
                newPersona.TRABAJADOR.Recomendable = _persona.TRABAJADOR.Recomendable;
                newPersona.TRABAJADOR.Sindicato = _persona.TRABAJADOR.Sindicato;


                newPersona.TRABAJADOR.EXPEDIENTE.IdTrabajador = _persona.TRABAJADOR.Id;
                newPersona.TRABAJADOR.EXPEDIENTE.FichaPersonal = _persona.TRABAJADOR.EXPEDIENTE.FichaPersonal;
                newPersona.TRABAJADOR.EXPEDIENTE.HojaInduccion = _persona.TRABAJADOR.EXPEDIENTE.HojaInduccion;
                newPersona.TRABAJADOR.EXPEDIENTE.HistorialFotocheck = _persona.TRABAJADOR.EXPEDIENTE.HistorialFotocheck;
                newPersona.TRABAJADOR.EXPEDIENTE.InformePsicologico = _persona.TRABAJADOR.EXPEDIENTE.InformePsicologico;
                newPersona.TRABAJADOR.EXPEDIENTE.CertificadoEstudios = _persona.TRABAJADOR.EXPEDIENTE.CertificadoEstudios;
                newPersona.TRABAJADOR.EXPEDIENTE.CertificadoTrabajo = _persona.TRABAJADOR.EXPEDIENTE.CertificadoTrabajo;
                newPersona.TRABAJADOR.EXPEDIENTE.HojaVida = _persona.TRABAJADOR.EXPEDIENTE.HojaVida;
                newPersona.TRABAJADOR.EXPEDIENTE.CursoCertificados = _persona.TRABAJADOR.EXPEDIENTE.CursoCertificados;
                newPersona.TRABAJADOR.EXPEDIENTE.CopiaDNI = _persona.TRABAJADOR.EXPEDIENTE.CopiaDNI;
                newPersona.TRABAJADOR.EXPEDIENTE.ConstanciaAFP = _persona.TRABAJADOR.EXPEDIENTE.ConstanciaAFP;
                newPersona.TRABAJADOR.EXPEDIENTE.PartidaMatrimonio = _persona.TRABAJADOR.EXPEDIENTE.PartidaMatrimonio;
                newPersona.TRABAJADOR.EXPEDIENTE.CopiaDNIPareja = _persona.TRABAJADOR.EXPEDIENTE.CopiaDNIPareja;
                newPersona.TRABAJADOR.EXPEDIENTE.CopiaDNIHijos = _persona.TRABAJADOR.EXPEDIENTE.CopiaDNIHijos;
                newPersona.TRABAJADOR.EXPEDIENTE.ConstanciaEstudiosHijos = _persona.TRABAJADOR.EXPEDIENTE.ConstanciaEstudiosHijos;
                newPersona.TRABAJADOR.EXPEDIENTE.HojasComplementarias = _persona.TRABAJADOR.EXPEDIENTE.HojasComplementarias;
                newPersona.TRABAJADOR.EXPEDIENTE.Retenciones = _persona.TRABAJADOR.EXPEDIENTE.Retenciones;
                newPersona.TRABAJADOR.EXPEDIENTE.Observaciones = _persona.TRABAJADOR.EXPEDIENTE.Observaciones;

                personaBL.AddPersonaTrabajador(newPersona);

                TempData["AlertMessage"] = "Registro Correcto";
                return RedirectToAction("Create");
            }
            catch (Exception ex)
            {
                TempData["AlertMessage"] = ex.Message;
                return RedirectToAction("Create");
            }
        }


        public ActionResult Edit(int id = 0)
        {
            if (id == 0)
            {
                return RedirectToAction("Index", "Trabajador");
            }

            ViewData["IdPersona"] = id;

            var persona = personaBL.GetFromPersonaById(id);
            var trabajador = _trabajadorBL.GetFromTrabajadorById(id);

            var a = persona.FechaNacimiento.Value.ToShortDateString();

            var FechaNacimiento = a.Substring(3, 2) + "/" + a.Substring(0, 2) + "/" + a.Substring(6, 4);


            ViewData["FechaNacimiento"] = FechaNacimiento;

            if (persona == null)
            {
                return RedirectToAction("Index", "Trabajador");
            }

            var sexo = sexoBL.GetAllFromSexo();
            ViewData["IdSexo"] = new SelectList(sexo, "IdSexo", "Descripcion", persona.IdSexo);

            var estadoCivil = estCivilBL.GetAllFromEstadoCivil();
            ViewData["IdEstadoCivil"] = new SelectList(estadoCivil, "IdEstadoCivil", "Descripcion", persona.IdEstadoCivil);



            var socio = socioBL.GetAllFromSocio();
            ViewData["IdSocio"] = new SelectList(socio, "IdSocio", "RazonSocial", persona.TRABAJADOR.IdSocio);

            var regimenPensionario = regPensionarioBL.GetAllFromRegimenPensionario();
            ViewData["IdRegimenPensionario"] = new SelectList(regimenPensionario, "IdRegimenPensionario", "Descripcion", persona.TRABAJADOR.IdRegimenPensionario);

            var banco = bancoBL.GetAllFromBanco();
            ViewData["IdBanco"] = new SelectList(banco, "IdBanco", "Descripcion", persona.TRABAJADOR.IdBanco);

            var ubicTrb = ubicTrabBL.GetAllFromUbicacionTrabajador();
            ViewData["IdUbicacionTrabajador"] = new SelectList(ubicTrb, "IdUbicacionTrabajador", "Descripcion", persona.TRABAJADOR.IdUbicacionTrabajador);

            var ubigeo = ubigeoBL.GetAllFromUbigeos();
            ViewData["IdUbigeo"] = new SelectList(ubigeo, "IdUbigeo", "UbigeoCompleto", persona.TRABAJADOR.IdUbigeo);

            var rural = ruralBL.GetAllFromRural();
            ViewData["IdRural"] = new SelectList(rural, "IdRural", "CentroPoblado", persona.TRABAJADOR.IdRural);

            var estudios = estudioBL.GetAllFromEstudios();
            ViewData["IdEstudios"] = new SelectList(estudios, "IdEstudios", "EstudiosCompletos", persona.TRABAJADOR.IdEstudios);

            var referencia = referenciaBL.GetAllFromReferencia();
            ViewData["IdReferencia"] = new SelectList(referencia, "IdReferencia", "ParentescoCompleto", persona.TRABAJADOR.IdReferencia);

            //persona.TRABAJADOR = trabajador;

            return View(persona);

        }


        [HttpPost]
        public ActionResult Edit(int id, FormCollection colection, PERSONA _persona)
        {
            var newPersona = new PERSONA();
            var _trabajador = new TRABAJADOR();
            newPersona.TRABAJADOR = _trabajador;

            try
            {
                var fecha = colection["FechaNacimiento"].ToString();

                var fechaNacimientoDateTimePicker =
                Convert.ToDateTime(fecha.Substring(3, 2) + "-" + fecha.Substring(0, 2) + "-" + fecha.Substring(6, 4));

                var edad = Math.Floor((System.DateTime.Now - fechaNacimientoDateTimePicker.Date).TotalDays / 365);

                newPersona.FechaNacimiento = fechaNacimientoDateTimePicker;
                newPersona.TRABAJADOR.Edad = edad.ToString();
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                msg = "Ingrese una fecha de Nacimiento Válida";

                TempData["AlertMessage"] = msg;

                return RedirectToAction("Create");
            }


            try
            {

                newPersona.IdPersona = id;
                newPersona.Dni = colection["Dni"].ToString();
                newPersona.ApePaterno = colection["ApePaterno"].ToString();
                newPersona.ApeMaterno = colection["ApeMaterno"].ToString();
                newPersona.Nombres = colection["Nombres"].ToString();
                newPersona.IdSexo = Int32.Parse(colection["IdSexo"].ToString());
                newPersona.IdEstadoCivil = Int32.Parse(colection["IdEstadoCivil"].ToString());
                newPersona.Direccion = colection["Direccion"].ToString();
                newPersona.Email = colection["Email"].ToString();

                newPersona.TRABAJADOR.Id = id;
                newPersona.TRABAJADOR.Hijos = Int32.Parse(colection["TRABAJADOR.Hijos"].ToString());
                newPersona.TRABAJADOR.AutogeneradoEsSalud = colection["TRABAJADOR.AutogeneradoEsSalud"].ToString();
                newPersona.TRABAJADOR.CondicionDomicilio = colection["TRABAJADOR.CondicionDomicilio"].ToString();
                newPersona.TRABAJADOR.GrupoSanguineo = colection["TRABAJADOR.GrupoSanguineo"].ToString();
                newPersona.TRABAJADOR.IdBanco = Int32.Parse(colection["IdBanco"].ToString());
                newPersona.TRABAJADOR.IdEstudios = Int32.Parse(colection["IdEstudios"].ToString());
                newPersona.TRABAJADOR.IdReferencia = Int32.Parse(colection["IdReferencia"].ToString());
                newPersona.TRABAJADOR.IdRegimenPensionario = Int32.Parse(colection["IdRegimenPensionario"].ToString());
                newPersona.TRABAJADOR.IdRural = Int32.Parse(colection["IdRural"].ToString());
                newPersona.TRABAJADOR.IdSocio = Int32.Parse(colection["IdSocio"].ToString());
                newPersona.TRABAJADOR.IdUbicacionTrabajador = Int32.Parse(colection["IdUbicacionTrabajador"].ToString());
                newPersona.TRABAJADOR.IdUbigeo = Int32.Parse(colection["IdUbigeo"].ToString());
                newPersona.TRABAJADOR.Nacionalidad = "PERUANA";
                newPersona.TRABAJADOR.NroConstanciaEstudios = colection["TRABAJADOR.NroConstanciaEstudios"].ToString();
                newPersona.TRABAJADOR.NroCuenta = colection["TRABAJADOR.NroCuenta"].ToString();
                newPersona.TRABAJADOR.NroCusp = colection["TRABAJADOR.NroCusp"].ToString();
                newPersona.TRABAJADOR.Observacion = colection["TRABAJADOR.Observacion"].ToString();
                newPersona.TRABAJADOR.Talla = colection["TRABAJADOR.Talla"].ToString();
                newPersona.TRABAJADOR.Zapato = colection["TRABAJADOR.Zapato"].ToString();
                newPersona.TRABAJADOR.PaisEmisor = "PERÚ";
                newPersona.TRABAJADOR.Recomendable = _persona.TRABAJADOR.Recomendable;
                newPersona.TRABAJADOR.Sindicato = _persona.TRABAJADOR.Sindicato;


                personaBL.UpdatePersonaTrabajador(newPersona);

                TempData["AlertMessage"] = "Modificacion Correcta";
                return RedirectToAction("Edit");
            }
            catch (Exception ex)
            {
                TempData["AlertMessage"] = ex.Message;

                return RedirectToAction("Edit");
            }


        }


        public ActionResult Details(int id = 0)
        {
            if (id == 0)
            {
                return RedirectToAction("Index", "Trabajador");
            }

            var persona = personaBL.GetFromPersonaById(id);
            var trabajador = _trabajadorBL.GetFromTrabajadorById(id);
            persona.TRABAJADOR = trabajador;

            if (persona == null)
            {
                return RedirectToAction("Index", "Trabajador");
            }

            return PartialView(persona);
        }

        public ActionResult Delete(int id)
        {
            try
            {
                //personaTrabajadorBL.RemoveCategoria(id);
                return RedirectToAction("Index");
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }

        public ActionResult ValidarDni(string dni, int id = 0)
        {
            var persona = personaBL.GetFromPersonaByDni(dni);

            var existe = persona == null ? false : true;

            var result = new
            {
                existe = existe,
                persona = persona != null ? persona.NombreCompleto : ""
            };

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetCurriculum(Int32 id)
        {
            var trabajador = _trabajadorBL.DownloadCurriculum(id);

            if (trabajador.CURRICULO != null)
            {
                return File(trabajador.CURRICULO.Imagen, "application/pdf", Server.UrlEncode(trabajador.CURRICULO.Hash));
            }
            else
            {
                ViewBag.ResultMessage = "Este trabajador no cuenta con Curriculum!";
                return View();
            }
        }

        public ActionResult Search(string nombrePersona)
        {
            var result = referenciaBL.GetAllFromReferencia()
                .Where(r => r.PERSONA.Nombres.ToUpper().Contains(nombrePersona.ToUpper())
                    || r.PERSONA.ApePaterno.ToUpper().Contains(nombrePersona.ToUpper())
                    || r.PERSONA.ApeMaterno.ToUpper().Contains(nombrePersona.ToUpper()))
                .Take(10)
                .Select(r => new { id = r.IdPersona, label = r.PERSONA.NombreCompleto +"-" + r.Parentesco, name = "IdReferencia" });

            return Json(result, JsonRequestBehavior.AllowGet);

        }

        public ActionResult CreatePersona(FormCollection collection)
        {
            var sexo = sexoBL.GetAllFromSexo();
            ViewData["IdSexo"] = new SelectList(sexo, "IdSexo", "Descripcion");

            var estadoCivil = estCivilBL.GetAllFromEstadoCivil();
            ViewData["IdEstadoCivil"] = new SelectList(estadoCivil, "IdEstadoCivil", "Descripcion");

            return View();
        }

        [HttpPost]
        public ActionResult CreatePersona(PERSONA _persona, FormCollection collection)
        {
            _persona.SEXO = null;
            _persona.DERECHO_HABIENTE = null;
            _persona.ESTADO_CIVIL = null;
            _persona.IdSexo = Int32.Parse(collection["IdSexo"].ToString());
            _persona.IdEstadoCivil = Int32.Parse(collection["IdEstadoCivil"].ToString());

            try
            {
                var fecha = collection["FechaNacimiento"].ToString();

                var fechaNacimientoDateTimePicker =
                Convert.ToDateTime(fecha.Substring(3, 2) + "-" + fecha.Substring(0, 2) + "-" + fecha.Substring(6, 4));
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                msg = "Ingrese una fecha de Nacimiento Válida";

                TempData["AlertMessage"] = msg;

                return RedirectToAction("CreatePersona");
            }
            personaBL.AddPersona(_persona);

            var sexo = sexoBL.GetAllFromSexo();
            ViewData["IdSexo"] = new SelectList(sexo, "IdSexo", "Descripcion");

            var estadoCivil = estCivilBL.GetAllFromEstadoCivil();
            ViewData["IdEstadoCivil"] = new SelectList(estadoCivil, "IdEstadoCivil", "Descripcion");

            return View();
        }

    }
}
